package com.jin.util;

        import com.fasterxml.jackson.core.JsonProcessingException;
        import com.fasterxml.jackson.core.type.TypeReference;
        import com.fasterxml.jackson.databind.ObjectMapper;
        import com.jin.Exception.http.ServerErrorException;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Component;

        import java.util.ArrayList;
        import java.util.HashMap;
        import java.util.List;

//二合一
@Component
public class GenericAndJson {
    private static ObjectMapper mapper;
    //setter注入(三种注入方法之一)
    @Autowired
    public void setMapper(ObjectMapper mapper){
        //绝
        GenericAndJson.mapper = mapper;
    }
    //序列化方法
    public static <T> String objectToJson(T o){
        try {
            return mapper.writeValueAsString(o);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            throw new ServerErrorException(9999);
        }
    }


    //反序列化方法(只能处理单体)
    //TypeReference能获取List<T>这样一种数组类型的泛型参数
    public static <T> T jsonToObject(String s,TypeReference<T> tr){
        if (s==null){
            return null;
        }
        try {
            return mapper.readValue(s,tr);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            throw new ServerErrorException(9999);
        }
    }


    // List<T> 泛型 T
    // List<S> 只有<s>是个泛型
    //这个方法是按照List<T>是一个整体的T来决定的（处理单体集合都可以）
    public static <T> T jsonToList(String s, TypeReference<T> tr){
        if (s==null){
            return null;
        }
        try {
            return mapper.readValue(s,tr);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            throw new ServerErrorException(9999);
        }
    }


    //List<S> 把<s>当做泛型处理,这个在转化的过程中会变为LinkedHashMap
//    public static <T> List<T> jsonToList(String s){
//        if (s==null){
//            return null;
//        }
//        try {
//            return mapper.readValue(s, new TypeReference<List<T>>(){
//            });
//        } catch (JsonProcessingException e) {
//            e.printStackTrace();
//            throw new ServerErrorException(9999);
//        }
//    }



























}
